home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / mint / lib / mntc6846.zoo / patch / xnorm8.s < prev   
Encoding:
Text File  |  1994-11-14  |  3.0 KB  |  120 lines

  1.  ! C68 8-byte-floating point normalization routine
  2.  !-----------------------------------------------------------------------------
  3.  ! ported to 68000 by Kai-Uwe Bloem, 12/89
  4.  !  #1  original author: Peter S. Housel
  5.  !  #2  replaced shifts by swap if possible for speed increase    -kub-, 01/90
  6.  !  #3  add handling for denormalized numbers            -kub-, 01/90
  7.  !  #4  Changed entry point name for C68 v4.3 compatibility
  8.  !    Changed handling of overflow error            -djw-  09/93
  9.  !-----------------------------------------------------------------------------
  10.  
  11.     .sect .text
  12.  
  13.     .define .Xnorm8
  14.  
  15. !-----------------------------------------------
  16. ! on entry to norm8:
  17. !    D0.w    exponent value of result
  18. !    D2.w    sign byte in left most bit position
  19. !        sticky bit in least significant byte
  20. !    D1    rounding bits
  21. !    A1    mantissa pointer
  22. !-----------------------------------------------
  23.  
  24. .Xnorm8:
  25.     clr.l    d1
  26.     movem.l    d3-d6,-(sp)    ! save some registers
  27.  
  28.     movem.l    (a1),d4-d5
  29.     move.l    d4,d3        ! rounding and u.mant == 0 ?
  30.     or.l    d5,d3
  31.     bne    1f
  32.     tst.b    d1
  33.     beq    retz
  34. 1:
  35.     move.l    d4,d3
  36.     and.l    #0xfffff000,d3    ! fast shift, 16 bits ?
  37.     bne    2f
  38.     cmp.w    #9,d0        ! shift is going to far; do normal shift
  39.     ble    2f        !  (minimize shifts here : 10l = 16l + 6r)
  40.     swap    d4        ! yes, swap register halfs
  41.     swap    d5
  42.     move.w    d5,d4
  43.     move.b    d1,d5        ! some doubt about this one !
  44.     lsl.w    #8,d5
  45.     clr.w    d1
  46.     sub.w    #16,d0        ! account for swap
  47.     bra    1b
  48. 2:
  49.     clr.b    d2        ! "sticky byte"
  50.     move.l    #0xffe00000,d6
  51. 3:    tst.w    d0        ! divide (shift)
  52.     ble    0f        !  denormalized number
  53. 4:    move.l    d4,d3
  54.     and.l    d6,d3        !  or until no bits above 53
  55.     beq    4f
  56. 0:    add.w    #1,d0        ! increment exponent
  57.     lsr.l    #1,d4
  58.     roxr.l    #1,d5
  59.     or.b    d1,d2        ! set "sticky"
  60.     roxr.b    #1,d1        ! shift into rounding bits
  61.     bra    4b
  62. 4:
  63.     and.b    #1,d2
  64.     or.b    d2,d1        ! make least sig bit "sticky"
  65.     move.l    #0xfff00000,d6
  66. 5:    move.l    d4,d3        ! multiply (shift) until
  67.     and.l    d6,d3        ! one in "implied" position
  68.     bne    6f
  69.     sub.w    #1,d0        ! decrement exponent
  70.     beq    6f        !  too small. store as denormalized number
  71.     add.b    d1,d1        ! some doubt about this one *
  72.     addx.l    d5,d5
  73.     addx.l    d4,d4
  74.     bra    5b
  75. 6:
  76.     tst.b    d1        ! check rounding bits
  77.     bge    8f        ! round down - no action neccessary
  78.     neg.b    d1
  79.     bvc    7f        ! round up
  80.     btst    #0,d5        ! tie case - use state of last bit
  81.     beq    8f        ! .. no rounding needed
  82. 7:
  83.     clr.l    d1        ! zero rounding bits
  84.     add.l    #1,d5
  85.     addx.l    d1,d4
  86.     tst.w    d0
  87.     bne    0f        ! renormalize if number was denormalized
  88.     add.w    #1,d0        ! correct exponent for denormalized numbers
  89.     bra    2b
  90. 0:    move.l    d4,d3        ! check for rounding overflow
  91.     and.l    #0xffe00000,d3
  92.     bne    2b        ! go back and renormalize
  93. 8:
  94.     move.l    d4,d3        ! check if normalization caused an underflow
  95.     or.l    d5,d3
  96.     beq    retz
  97.     cmp.w    #0,d0        ! check for exponent overflow or underflow
  98.     blt    retz
  99.     cmp.w    #2047,d0
  100.     bge    oflow
  101.  
  102.     lsl.w    #4,d0        ! re-position exponent
  103.     and.w    #0x8000,d2    ! sign bit
  104.     or.w    d2,d0
  105.     swap    d0        ! map to upper word
  106.     clr.w    d0
  107.     and.l    #0x0fffff,d4    ! top mantissa bits
  108.     or.l    d0,d4        ! insert exponent and sign
  109.     movem.l    d4-d5,(a1)
  110. finish:    movem.l    (sp)+,d3-d6
  111.     rts
  112.  
  113. retz:    clr.l    (a1)+
  114.     clr.l    (a1)
  115.     bra    finish
  116.  
  117. oflow:    jsr    .overflow    ! call overflow exception routine
  118.     movem.l    d0-d1,(a1)    ! set reurn value
  119.     bra    finish        ! ... and exit
  120.